package main

import (
	"flag"
	"fmt"

	"os"
	"os/signal"
	"syscall"
	"user_api/global"
	"user_api/initialize"
	"user_api/util/register/consul"

	"github.com/google/uuid"
	"go.uber.org/zap"
)

func main() {
	flag.Parse()
	quit := make(chan os.Signal, 1)
	defer func() {
		if err := recover(); err != nil {
			zap.L().Error("运行时错误", zap.Any("err", err))
			quit <- syscall.SIGQUIT
		}
	}()
	// mode 开发模式,local, dev,test,prod
	mode := os.Getenv("BUILD_ENV")

	if mode == "" {
		mode = "local"
	}

	// 获取是否是debug模式
	isDebug := initialize.IsDebug(mode)

	// 初始化logger
	initialize.InitLogger(isDebug)

	// 初始化配置文件
	initialize.InitConfig(mode)

	// 初始化trans
	initialize.InitTrans("zh")

	// 注册验证器
	initialize.InitValidators()

	// 初始化连接
	initialize.InitRpcConn()

	zap.L().Info("启动服务器", zap.Int("端口:", global.ServerConfig.Port))
	// 初始化router
	r := initialize.InitRouter(isDebug)
	go func() {
		r.Run(fmt.Sprintf("0.0.0.0:%d", global.ServerConfig.Port))
	}()

	// 注册服务
	registry := consul.NewRegistry(global.ServerConfig.Consul.Host, global.ServerConfig.Consul.Port)
	serviceId := uuid.Must(uuid.NewUUID()).String()
	err := registry.Register(global.ServerConfig.Host, global.ServerConfig.Port, global.ServerConfig.Name, global.ServerConfig.Tags, serviceId)
	if err != nil {
		zap.L().Panic("register failed", zap.Error(err))
		return
	}

	// 优雅退出
	// kill -9 是捕捉不到的
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit

	zap.L().Info("Shutdown Server.")
	zap.L().Info("注册中心主动注销服务")

	// 注销服务
	err = registry.DeRegister(serviceId)
	if err != nil {
		zap.L().Error("注销consul失败", zap.Error(err))
	}

	// 同步logger信息
	zap.L().Sync()
}
